package com.ruoyi.common.utils;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
import com.ruoyi.common.utils.ip.IpUtils;

/**
 * 小程序工具类
 * 
 * @author ruoyi
 */
public class MiniprogramUtils
{
    /**
     * 小程序标识映射
     * 可以根据实际的小程序AppID进行配置
     */
    private static final Map<String, String> MINIPROGRAM_MAP = new HashMap<>();
    
    static {
        // 根据实际的小程序AppID配置
        MINIPROGRAM_MAP.put("wxca9f77da97034a56", "watermark_remover"); // 去水印工具
        MINIPROGRAM_MAP.put("wx1234567890abcdef", "video_parser"); // 视频解析器
        MINIPROGRAM_MAP.put("wxabcdef1234567890", "short_video_helper"); // 短视频助手
    }
    
    /**
     * 从请求中获取小程序标识
     * 
     * @param request HTTP请求
     * @return 小程序标识
     */
    public static String getMiniprogramId(HttpServletRequest request)
    {
        // 优先从请求头获取小程序标识
        String miniprogramId = request.getHeader("X-Miniprogram-Id");
        if (StringUtils.isNotEmpty(miniprogramId)) {
            return miniprogramId;
        }
        
        // 从User-Agent中提取小程序信息
        String userAgent = request.getHeader("User-Agent");
        if (StringUtils.isNotEmpty(userAgent)) {
            // 检查是否包含小程序标识
            if (userAgent.contains("miniprogram")) {
                // 尝试从User-Agent中提取AppID
                String appId = extractAppIdFromUserAgent(userAgent);
                if (StringUtils.isNotEmpty(appId)) {
                    return MINIPROGRAM_MAP.getOrDefault(appId, "unknown_miniprogram");
                }
            }
        }
        
        // 从请求参数中获取
        miniprogramId = request.getParameter("miniprogramId");
        if (StringUtils.isNotEmpty(miniprogramId)) {
            return miniprogramId;
        }
        
        // 默认返回未知小程序
        return "unknown_miniprogram";
    }
    
    /**
     * 从User-Agent中提取AppID
     * 
     * @param userAgent User-Agent字符串
     * @return AppID
     */
    private static String extractAppIdFromUserAgent(String userAgent)
    {
        // 微信小程序的User-Agent格式示例：
        // Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.40(0x1800282f) NetType/WIFI Language/zh_CN miniProgram/wxca9f77da97034a56
        
        if (userAgent.contains("miniProgram/")) {
            int startIndex = userAgent.indexOf("miniProgram/") + 12;
            int endIndex = userAgent.indexOf(" ", startIndex);
            if (endIndex == -1) {
                endIndex = userAgent.length();
            }
            return userAgent.substring(startIndex, endIndex);
        }
        
        return null;
    }
    
    /**
     * 获取用户标识
     * 
     * @param request HTTP请求
     * @return 用户标识
     */
    public static String getUserId(HttpServletRequest request)
    {
        // 优先从请求头获取用户标识
        String userId = request.getHeader("X-User-Id");
        if (StringUtils.isNotEmpty(userId)) {
            return userId;
        }
        
        // 从请求参数中获取
        userId = request.getParameter("userId");
        if (StringUtils.isNotEmpty(userId)) {
            return userId;
        }
        
        // 从IP地址生成用户标识（作为备用方案）
        String userIp = IpUtils.getIpAddr(request);
        return "ip_" + userIp.replace(".", "_");
    }
    
    /**
     * 添加小程序标识到请求头
     * 
     * @param miniprogramId 小程序标识
     * @return 请求头Map
     */
    public static Map<String, String> addMiniprogramHeaders(String miniprogramId)
    {
        Map<String, String> headers = new HashMap<>();
        headers.put("X-Miniprogram-Id", miniprogramId);
        return headers;
    }
    
    /**
     * 添加用户标识到请求头
     * 
     * @param userId 用户标识
     * @return 请求头Map
     */
    public static Map<String, String> addUserHeaders(String userId)
    {
        Map<String, String> headers = new HashMap<>();
        headers.put("X-User-Id", userId);
        return headers;
    }
}
